/*
1、实现如下功能逻辑：
	写一段程序，使用系统调用fork( )创建两个子进程，再用系统调用signal( )让父进程捕捉键盘上来的中断信号（即按ctrl+c键），
	当捕捉到中断信号后，父进程用系统调用kill( )向两个子进程发出信号，子进程捕捉到父进程发来的信号后，分别输出下列信息后终止：  
		Child process 1 is killed by parent!
		Child process 2 is killed by parent!
	父进程等待两个子进程终止后，输出以下信息后终止：
        Parent process exit!

2、改进第一个题目中的要求，保证相关的时序正确性，即必须先看到子进程2退出，然后子进程1再退出，
最后父进程看到所有子进程退出后，最终输出终止信息。
*/

#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <wait.h>
#include <stdlib.h>


pid_t pid1;
pid_t pid2;


void parent_sig_handler(int signum)
{
	if(signum == SIGINT)
	{
		printf("Keyboard interrupt captured\n");
		kill(pid2, SIGUSR2);
	}
}

void child1_sig_handler(int signum)
{
	printf("child1 will be killed\n");
	exit(0);
}

void child2_sig_handler(int signum)
{
	printf("child2 will be killed\n");
	kill(pid1, SIGUSR1);
	exit(0);
}

int main(void)
{
	pid_t ppid = getpid();

	pid1 = fork();
	if(pid1 < 0)
		printf("fork1 failed\n");
	else if(pid1 == 0)
	{
		pid1 = getpid();
		printf("This is 1 child, pid1 = %d\n", pid1);
		signal(SIGINT, SIG_IGN);
		signal(SIGUSR1, child1_sig_handler);
		while(1);
	}
	else
	{
		pid2 = fork();
		if(pid2 < 0)
			printf("fork2 failed\n");
		else if(pid2 == 0)
		{
			pid2 = getpid();
			printf("This is 2 child, pid2 = %d\n", pid2);
			signal(SIGINT, SIG_IGN);
			signal(SIGUSR2, child2_sig_handler);
			while(1);

		}else
		{
			printf("this is parent process\n");
			signal(SIGINT, parent_sig_handler);
			pause();
			wait(NULL);
			wait(NULL);
			printf("parent process exit\n");
			exit(0);
		}	
	}

}
